#ifndef SELECT_TABLE_VIEW_H
    #define SELECT_TABLE_VIEW_H

#pragma once
#include <QDebug>           // 控制台输出流
#include <QWidget>
#include <QSqlDatabase>     // Qt数据库
#include <QSqlQuery>        // 数据库查询标头
#include <QSqlTableModel>   // Qt数据库表视图
#include <QSqlQueryModel>   // Qt数据库查询视图
// #include <QSqlRecord>       // Qt数据库中表等数据记录标头
#include <QSqlError>        // Qt数据库错误检查
// #include <QHeaderView>      // Qt表头视图
#include <QMessageBox>      // 消息提示标头

namespace Ui {
    class SelectTableView;
}

class SelectTableView : public QWidget
{
    Q_OBJECT

public:
    explicit SelectTableView(QWidget *parent = nullptr) = delete;
    explicit SelectTableView(QSqlDatabase& db, QWidget *parent = nullptr);
    ~SelectTableView();

private slots:
    void on_cancel_pushButton_clicked();

    void on_run_sql_pushButton_clicked();

    void on_select_all_pushButton_clicked();

    void on_submit_pushButton_clicked();

private:
    Ui::SelectTableView *select_ui;

    QSqlDatabase select_db;
    QSqlTableModel* table_model;
    QSqlQueryModel* query_model;

    bool is_table;  // 用于判断是否可以修改表数据，true 表示可以，Qt原码已经实现，所以这里将功能改为提交修改时的提示
};

#endif // SELECT_TABLE_VIEW_H

/*
实际项目中至少还需考虑如下问题：
1、数据验证
    // 在模型级别添加数据验证
    model->setHeaderData(0, Qt::Horizontal, "学号");
    model->setHeaderData(1, Qt::Horizontal, "姓名");

    // 设置字段约束
    model->setData(model->index(0, 1), QVariant(), Qt::EditRole);  // 设置姓名字段不可为空

2、事务处理
// 开始事务
    db.transaction();

    // 执行批量操作...
    model->submitAll();

    // 提交事务
    if (!db.commit()) {
        db.rollback();
        QMessageBox::critical(nullptr, "错误", "事务提交失败");
    }

3、问题处理机制
    // 查看最后执行的 SQL 语句
    qDebug() << model->query().lastQuery();

    // 强制刷新数据
    model->setFilter("");  // 保持当前过滤条件不变
    model->select();


可能还需要高级功能：
一、版本控制
    // 在模型数据改变时记录日志
    QObject::connect(model, &QSqlTableModel::dataChanged,
                   [](const QModelIndex &topLeft, const QModelIndex &bottomRight) {
        qDebug() << "数据修改范围：" << topLeft.row() << "-" << bottomRight.row();
    });

二、增量加载
    // 分批加载数据
    model->setFetchSize(50);  // 每次取50条
    while (model->canFetchMore())
        model->fetchMore();

三、数据加密
    // 在 beforeUpdate 信号中处理加密
    QObject::connect(model, &QSqlTableModel::beforeUpdate,
                   [](int row, QSqlRecord &record) {
        QString encrypted = encryptData(record.value("secret").toString());
        record.setValue("secret", encrypted);
    });


此外，还应考虑以下问题：
 * 自动重连机制
 * SQL 注入防护
 * 数据修改审计日志
 * 二进制大字段 (BLOB) 处理
 * 数据库连接池支持


编程助手生成的完整项目示例结构：
    MyDatabase/
    ├── Database/
    │   ├── DBServer.h      # 数据库连接管理
    │   └── DBWorker.h      # 后台数据库操作线程
    ├── Models/
    │   └── StudentModel.h  # 继承 QSqlTableModel 的定制模型
    └── Views/
        └── StudentView.h   # 继承 QTableView 的定制视图
*/
